composetable: Add a prefix api
authorMatthias Clasen <mclasen@redhat.com>
Thu, 29 Jul 2021 12:23:40 +0000 (08:23 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 29 Jul 2021 12:23:40 +0000 (08:23 -0400)
Add a function that computes the longest prefix
of a buffer for which a compose table has matches.

gtk/gtkcomposetable.c
gtk/gtkcomposetable.h

index 40dd8b6e41fe05b5e8a635b5152b3a301821f11e..0d9488c214ad489fade0ff171976eba667bf3eb8 100644 (file)
@@ -1352,6 +1352,47 @@ gtk_compose_table_check (const GtkComposeTable *table,
   return FALSE;
 }
 
+void
+gtk_compose_table_get_prefix (const GtkComposeTable *table,
+                              const guint16         *compose_buffer,
+                              int                    n_compose,
+                              int                   *prefix)
+{
+  int index_stride = table->max_seq_len + 1;
+  int p = 0;
+
+  for (int idx = 0; idx < table->n_index_size; idx++)
+    {
+      const guint16 *seq_index = table->data + (idx * index_stride);
+
+      if (seq_index[0] == compose_buffer[0])
+        {
+          p = 1;
+
+          for (int i = 1; i < table->max_seq_len; i++)
+            {
+              int len = i + 1;
+
+              for (int j = seq_index[i]; j < seq_index[i + 1]; j += len)
+                {
+                  int k;
+
+                  for (k = 0; k < MIN (len, n_compose) - 1; k++)
+                    {
+                      if (compose_buffer[k + 1] != (gunichar) table->data[j + k])
+                        break;
+                    }
+                  p = MAX (p, k + 1);
+                }
+            }
+
+          break;
+        }
+    }
+
+  *prefix = p;
+}
+
 void
 gtk_compose_table_foreach (const GtkComposeTable      *table,
                            GtkComposeSequenceCallback  callback,
index 1398559a66044a0675bc966f7dfa6ae6ae2dee12..e9adc501507f039273b24cf22a228e5335cd5b0c 100644 (file)
@@ -80,6 +80,11 @@ gboolean          gtk_compose_table_check   (const GtkComposeTable *table,
                                              gboolean              *compose_match,
                                              GString               *output);
 
+void              gtk_compose_table_get_prefix (const GtkComposeTable *table,
+                                                const guint16         *compose_buffer,
+                                                int                    n_compose,
+                                                int                   *prefix);
+
 gboolean          gtk_check_algorithmically (const guint16         *compose_buffer,
                                              int                    n_compose,
                                              gunichar              *output);